package vip.liux.backend.infrastructure.constants;

import lombok.Getter;

public interface GenConst {

    // 从数据库中获取表详细信息的SQL查询
    String QUERY_TABLE_SQL = """
            select table_name, table_comment, create_time, update_time from information_schema.tables
            where table_schema = (select database())
            AND table_name NOT LIKE 'gen_%'
            AND table_name NOT IN (select table_name from gen_table)
            AND table_name in (:tableNames)""";

    String QUERY_ALL_TABLE_SQL = """
            select table_name, table_comment, create_time, update_time from information_schema.tables
            where table_schema = (select database())
            AND table_name NOT LIKE 'gen_%'
            AND table_name NOT IN (select table_name from gen_table)""";

    String QUERY_COLUMN_SQL = """
            select column_name,
                   (IF((is_nullable = 'no' && column_key != 'PRI'), '1', null)) as required,
                   (IF(column_key = 'PRI', '1', '0'))                           as `primary`,
                   ordinal_position                                             as sort,
                   column_comment,
                   (IF(extra = 'auto_increment', '1', '0'))                     as increment,
                   column_type
            from information_schema.columns
            where table_schema = (select database())
              and table_name = (:tableName)
                order by ordinal_position;
            """;
    String DATA_SOURCE_CACHE = "dataSourceCache";

    /**
     * 生成代码的包路径
     */
    String PACKAGE_NAME = "vip.liux.backend";

    /**
     * 自动去除表前缀，默认为false
     */
    boolean AUTO_REMOVE_PRE = false;

    /**
     * 表前缀（类名��不包含表前缀）
     */
    String TABLE_PREFIX = null;

    /**
     * 数据库字符串类型
     */
    String[] COLUMN_TYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; // 字符串类型

    /**
     * 数据库文本类型
     */
    String[] COLUMN_TYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; // 文本类型

    /**
     * 数据库时间类型
     */
    String[] COLUMN_TYPE_TIME = {"datetime", "time", "date", "timestamp"}; // 时间类型
    /**
     * 数据库时间类型
     */
    String[] COLUMN_TYPE_BOOL = {"tinyint"}; // 时间类型
    /**
     * 数据库数字类型
     */
    String[] COLUMN_TYPE_NUMBER = {"smallint", "mediumint", "int", "bigint", "float", "double", "decimal"}; // 数字类型

    /**
     * 页面不需要编辑字段
     */
    String[] COLUMN_NAME_NOT_EDIT = {"id", "creator_id", "creation_time", "last_modification_time", "last_modifier_id", "tenant_id", "extra_properties", "concurrency_stamp"}; // 不需要编辑的字段

    /**
     * 页面不需要显示的列表字段
     */
    String[] COLUMN_NAME_NOT_LIST = {"id", "creator_id", "creation_time", "last_modification_time", "last_modifier_id", "tenant_id", "extra_properties", "concurrency_stamp"}; // 不需要显示的��表字段

    /**
     * 页面不需要查询字段
     */
    String[] COLUMN_NAME_NOT_QUERY = {"id", "creator_id", "creation_time", "last_modification_time", "last_modifier_id", "tenant_id", "extra_properties", "concurrency_stamp"}; // 不需要查询的字段

    /**
     * 父类抽象字段
     */
    String[] COLUMN_NAME_NOT_BASE = {"id", "creator_id", "creation_time", "last_modification_time", "last_modifier_id", "tenant_id", "extra_properties", "concurrency_stamp"}; // 不需要查询的字段

    enum GenType {
        ZIP, // 压缩包
        CUSTOM_PATH // 自定义路径
    }

    @Getter
    enum DataSourceType {
        // 数据源类型(0:hikari 1:druid 2:tomcat 3:dbcp2)
        HIKARI("com.zaxxer.hikari.HikariDataSource"), // Hikari 数据源
        DRUID("com.alibaba.druid.pool.DruidDataSource"), // Druid 数据源
        TOMCAT("org.apache.tomcat.jdbc.pool.DataSource"), // Tomcat 数据源
        DBCP2("org.apache.commons.dbcp2.BasicDataSource"); // DBCP2 数据源

        private final String className;

        DataSourceType(String className) {
            this.className = className;
        }
    }

    enum DbType {
        // 数据库类型(0:MySQL 1:PostgresSQL 2:Oracle 3:SQL Server)
        MYSQL, // MySQL 数据库
        POSTGRESQL, // PostgresSQL 数据库
        ORACLE, // Oracle 数据库
        SQLSERVER // SQL Server 数据库
    }

    enum QueryType {
        // 查询类型(0:等于 1:不等于 2:大于 3:小于 4:范围 5:模糊查询)
        EQUALS, // 等于
        NOT_EQUALS, // 不等于
        GREATER_THAN, // 大于
        LESS_THAN, // 小于
        RANGE, // 范围
        LIKE // 模糊查询
    }

    enum HtmlType {
        // 显示类型(0:文本框 1:文本域 2:下拉框 3:复选框 4:单选框 5:日期控件 6:上传 7:编辑器)
        INPUT, // 输入框
        TEXTAREA, // 文本域
        DROPDOWN, // 下拉框
        CHECKBOX, // 复选框
        RADIO, // 单选框
        DATEPICKER, // 日期选择器
        UPLOAD, // 上传
        EDITOR // 编辑器
    }

    @Getter
    enum JavaType {
        // JAVA类型(0:String 1:Integer 2:Long 3:Boolean 4:Double 5:Float 6:Date 7:Timestamp 8:BigDecimal)
        String("java.lang.String"),
        Integer("java.lang.Integer"),
        Long("java.lang.Long"),
        Boolean("java.lang.Boolean"),
        Double("java.lang.Double"),
        Float("java.lang.Float"),
        Date("java.util.Date"),
        Timestamp("java.sql.Timestamp"),
        BigDecimal("java.math.BigDecimal"),
        LocalDateTime("java.time.LocalDateTime");

        private final String fullyQualifiedName;

        JavaType(String fullyQualifiedName) {
            this.fullyQualifiedName = fullyQualifiedName;
        }
    }

    enum ColumnType {
        // 列类型(0:varchar 1:int 2:bigint 3:boolean 4:double 5:float 6:date 7:timestamp)
        VARCHAR, // 可变字符
        INT, // 整数
        BIGINT, // 大整数
        BOOLEAN, // 布尔值
        DOUBLE, // 双精度浮点数
        FLOAT, // 浮点数
        DATE, // 日期
        TIMESTAMP, // 时间戳,
        DECIMAL, // 高精度小数
        TINYINT,
        LONGTEXT;
    }
}
